Re: Unknown class ‘MyCustomView', using 'NSView' instead
Re: Unknown class ‘MyCustomView', using 'NSView' instead
- Subject: Re: Unknown class ‘MyCustomView', using 'NSView' instead
- From: Erwin Namal <email@hidden>
- Date: Sun, 22 Feb 2015 12:17:22 +0100
Thank you for your reply.
I already use both Other linker flags “-ObjC” and “-all_load” in the library, in its bundle target (though it is useless I think) and in the application including the library and the bundle with the nib.
Then, I load the nib in the bundle by using :
> initWithNibName:nibName bundle:libraryBundle
The other linker flags did solve the issue of categories in the library not visible in the application.
The thing I don’t understand is that I get the warning, but my application works fine. It shouldn’t if NSView was indeed used instead of MyCustomView.
Where do you put your linkerhack class ? In the library or in the app ?
Thanks for your help
– E
> On Feb 22, 2015, at 05:45 , Roland King <email@hidden> wrote:
>
>
>> On 22 Feb 2015, at 06:03, Erwin Namal <email@hidden <mailto:email@hidden>> wrote:
>>
>> Dear All,
>>
>> I am currently moving some of my app’s code out in a static library. I have subclasses of NSViewController and their nib.
>> Searching on the net I fond a way to deal with the nibs, by adding a bundle target in the library for all the .xib files and importing the bundle as a resource in my app.
>> Then, I can open the bundle and load the nibs.
>>
>> Now, when I do that, I get the following error in the console :
>>
>>> Unknown class ‘MyCustomView', using 'NSView' instead. Encountered in Interface Builder file at path . . . .
>>
>> How can I fix it ?
>>
>> Thanks for your help
>> – E
>
>
> The problem with static libraries and xibs is that the linker doesn’t know about the classes of objects in the xib so, if the class isn’t also referenced in your source code somewhere, it doesn’t get linked in and so the nib loading code can’t find it. This is a similar problem to using categories in static libraries.
>
> The constantly-recommended ‘solution’ for this is to pass the -ObjC or -all_load flags to the link. I hate that solution because it causes most or all of the static library to be linked into the code, whether you need it or not. Due to various bugs in the linker in times past there’s a trail of advice to be found suggesting you specify both flags and people have been gaily making huge fat binaries ever since.
>
> What I do in this case is ensure I have one source file (I usually call it LINKERHACK.m) which has something like this in it
>
> @interface LINKERHACK : NSObject
> +(void)loadClasses;
> @end
>
>
> @implementation LINKERHACK
> +(void)loadClasses
> {
> Class __unused class1 = [ SomeStaticClass class ];
> }
> @end
>
>
> That’s enough to get the linker to pull in the class you want. I add classes only found in the XIB into that list. I don’t believe you even need to call the function anywhere, just compiling it in is enough to get the dependencies the linker needs. Ugly, crude, but effective.
>
> I filed an enhancement request years ago that NIBs should be processed and added to the link-time required symbols. I have lost hope of ever seeing that happen.
>
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden