我想问一下有什么用背后的原因FOUNDATION_EXPORT,而不是extern在目标C项目.
我已经检查了这个问题,使用FOUNDATION_EXPORT得到了高达340分(第一名),而extern只使用了74分(第二名).
谁有人解释原因?是否有任何实际的理由FOUNDATION_EXPORT代替使用extern?
谢谢!
我正在使用NSUSerDefaults存储用户首选项.我记得在某处将键设置为常量是一个好主意 - 我同意.以下代码是我目前拥有的代码:
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:@"polygonNumberOfSides"];
Run Code Online (Sandbox Code Playgroud)
我尝试将其更改为:
@implementation Controller
NSString const *kPolygonNumberOfSides = @"polygonNumberOfSides";
-(void)savePolygonInfo {
[[NSUserDefaults standardUserDefaults]
setObject:[NSNumber numberWithInt:polygon.numberOfSides]
forKey:kPolygonNumberOfSides];
}
Run Code Online (Sandbox Code Playgroud)
虽然这确实有效,但它会产生" warning: passing argument 1 of 'objectForKey:' discards qualifiers from pointer target type".我很想让我的代码免受编译器警告的影响.我该如何修复此警告?
我在头文件const double EARTH_RADIUS=6353;中声明了一个常量,导入到各种其他头文件中,我收到了链接器错误.
Ld /Users/Teguh/Library/Developer/Xcode/DerivedData/BadgerNew-bjopcgcgsjkcvcevflfbvsjwfgnu/Build/Products/Debug-iphonesimulator/BadgerNew.app/BadgerNew normal i386
cd /Users/Teguh/Dropbox/badgers/BadgerNew
setenv MACOSX_DEPLOYMENT_TARGET 10.6
setenv PATH "/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin:/Developer/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin"
/Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-g++-4.2 -arch i386 -isysroot /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk -L/Users/Teguh/Library/Developer/Xcode/DerivedData/BadgerNew-bjopcgcgsjkcvcevflfbvsjwfgnu/Build/Products/Debug-iphonesimulator -F/Users/Teguh/Library/Developer/Xcode/DerivedData/BadgerNew-bjopcgcgsjkcvcevflfbvsjwfgnu/Build/Products/Debug-iphonesimulator -filelist /Users/Teguh/Library/Developer/Xcode/DerivedData/BadgerNew-bjopcgcgsjkcvcevflfbvsjwfgnu/Build/Intermediates/BadgerNew.build/Debug-iphonesimulator/BadgerNew.build/Objects-normal/i386/BadgerNew.LinkFileList -mmacosx-version-min=10.6 -Xlinker -objc_abi_version -Xlinker 2 -framework CoreLocation -framework UIKit -framework Foundation -framework CoreGraphics -framework CoreData -o /Users/Teguh/Library/Developer/Xcode/DerivedData/BadgerNew-bjopcgcgsjkcvcevflfbvsjwfgnu/Build/Products/Debug-iphonesimulator/BadgerNew.app/BadgerNew
ld: duplicate symbol _EARTH_RADIUS in /Users/Teguh/Library/Developer/Xcode/DerivedData/BadgerNew-bjopcgcgsjkcvcevflfbvsjwfgnu/Build/Intermediates/BadgerNew.build/Debug-iphonesimulator/BadgerNew.build/Objects-normal/i386/NearbyIsiKota.o and /Users/Teguh/Library/Developer/Xcode/DerivedData/BadgerNew-bjopcgcgsjkcvcevflfbvsjwfgnu/Build/Intermediates/BadgerNew.build/Debug-iphonesimulator/BadgerNew.build/Objects-normal/i386/FrontPageofBadger.o for architecture i386
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
基本上我希望常量可用于我项目中的所有类.我应该在哪里申报?
我在Xcode源代码树中定义了一个名为"MY_SRC_DIR"的路径变量.我想获取此环境变量的值,并将其放在obj-c代码中的NSString中.例如,
-(NSString*) getSourceDir
{
return @"${MY_SRC_DIR}"; // not the right solution and this is the question
}
Run Code Online (Sandbox Code Playgroud) 在尝试从显示获取数据的视图控制器中取消模型时,在异步提取完成时,我发布了NSNotification.
[[NSNotificationCenter defaultCenter] postNotificationName:@"foobarFetchSuccess" object: foo];
Run Code Online (Sandbox Code Playgroud)
我养成了使用的习惯:
#define FOO_FETCH_SUCCESS @"foobarFetchSuccess"
Run Code Online (Sandbox Code Playgroud)
在一个公共头文件中,然后将其用于addObserver:和removeObserver:以及postNotificationName:
[[NSNotificationCenter defaultCenter] addObserver:self @selector(gotData)
name:FOO_FETCH_SUCCESS object: baz];
Run Code Online (Sandbox Code Playgroud)
所以@"foobarFetchSuccess"字符串遍布整个地方.还有更多像他一样的人.那么一次声明一个字符串并在任何地方使用它的最佳方法是什么?
我的.h文件中有以下内容:
#ifndef _BALANCE_NOTIFICATION
#define _BALANCE NOTIFICATION
const NSString *BalanceUpdateNotification
#endif
Run Code Online (Sandbox Code Playgroud)
以及我的.m文件中的以下内容:
const NSString *BalanceUpdateNotification = @"BalanceUpdateNotification";
Run Code Online (Sandbox Code Playgroud)
我使用以下代码:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(updateBalance:)
name:BalanceUpdateNotification
object:nil];
Run Code Online (Sandbox Code Playgroud)
和
[[NSNotificatoinCenter defaultCenter]
postNotificationName:BalanceUpdateNotification
object:self userInfo:nil];
Run Code Online (Sandbox Code Playgroud)
哪个有效,但它给了我一个警告:
Passing argument 1 of 'postNotificationName:object:userInfo' discards qualifiers from pointer target type
Run Code Online (Sandbox Code Playgroud)
所以,我可以将其转换为(NSString*),但我想知道这样做的正确方法是什么.
我有一个像这样定义的字符串常量:
#define kMyString @"This is my string text!";
Run Code Online (Sandbox Code Playgroud)
代码中的某处我想用NSLog打印出这段代码:
NSLog(@"This is it: %@",kMyString);
Run Code Online (Sandbox Code Playgroud)
但是得到一个构建错误:Expected expression.
我已经看过Apple的格式说明符,但无法弄明白.
有人可以向我解释如何做到这一点?
谢谢!
这是一个新手C/Objective-C问题:-)
假设我想要一个CGRectOne和一个CGRectTwo常量.
我该怎么说呢?
谢谢,Jérémy
我想通过本主题中与NSStrings相同的样式制作一些NSNumber常量.也就是说,我正在创建单独的constants.h/.m文件并将它们导入需要访问它们的类中.
我想在objective-c中定义一个常量.
以前我有以下功能:
+(NSString *) getDocumentsDir {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex: 0];
paths = nil;
return documentsDir;
}
Run Code Online (Sandbox Code Playgroud)
我想只定义一个常量"Documents_Dir" - 当函数被调用时,之后访问以前创建的值.
我尝试了以下代码,但没有用:
#define getDocumentsDir \
{ \
#ifdef Documents_Dir \
return Documents_Dir; \
#else \
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); \
NSString *documentsDir = [paths objectAtIndex: 0]; \
#define Documents_Dir [paths objectAtIndex: 0]; \
paths = nil; \
return Documents_Dir; \
#endif \
} \
Run Code Online (Sandbox Code Playgroud)
我对预编译器指令不太满意,所以任何帮助都将不胜感激.