❶ 您arcGIS運行時腳本錯誤如何解決
在customize選擇arcmap option 然後清一下數據交互的緩存和其他緩存試試
❷ arc是一種編譯時特性還是運行時特性
ARC本質 ARC編譯器()特性運行特性更垃圾收器(GC) Automatic Reference Counting (ARC) is a compiler-level feature that simplifies the process of managing object lifetimes (memory management) in Cocoa applications. ARC相於MRC(Manual Reference Counting或稱非ARC文我直使用MRC指代非ARC管理式)改進前技術本質沒區別具體信息參考ARC編譯器官文檔 ARC啟與關閉 同於XCode四創建工程選擇關閉ARCXCode5創建工程默認啟ARC沒關閉ARC選項 需要特定文件啟或關閉ARC工程選項選擇Targets -> Compile Phases -> Compile Sources面找應文件添加flag: 打ARC:-fobjc-arc 關閉ARC:-fno-objc-arc 圖: ARC修飾符 ARC主要提供四種修飾符別:__strong,__weak,__autoreleasing,__unsafe_unretained __strong 表示引用強引用應定義property"strong"所象沒任何強引用指向才釋放 注意:聲明引用加修飾符引用默認強引用需要釋放強引用指向象需要強引用置nil __weak 表示引用弱引用應定義property用"weak"弱引用影響象釋放即要象沒任何強引用指向即使依00弱引用象指向沒用該象依釋放象釋放同指向弱引用自置nil技術叫zeroing weak pointer效防止效指針、野指針產__weak般用delegate關系防止循環引用或者用修飾指向由Interface Builder編輯與UI控制項 __autoreleasing 表示autorelease pool自釋放象引用MRC代autorelease用相同定義property能使用修飾符任何象property都應該autorelease型 見誤解ARC沒autorelease自釋放看起像點余誤解能源自於ARC自autorelease自混淆其實要看每iOS Appmain.m文件能知道autorelease僅存著並且變更fashion:需要再手工創建需要再顯式調用[drain]釋放內存池 兩行代碼意義相同 NSString *str = [[[NSString alloc] initWithFormat:@"hehe"] autorelease]; // MRC NSString *__autoreleasing str = [[NSString alloc] initWithFormat:@"hehe"]; // ARC 關於autoreleasepool做展詳細信息參考官文檔或者其文章 __autoreleasingARC主要用參數傳遞返值(out-parameters)引用傳遞參數(pass-by-reference)情況 __autoreleasing is used to denote arguments that are passed by reference (id *) and are autoreleased on return. 比用NSError使用: NSError *__autoreleasing error; if (![data writeToFile:filename options:NSDataWritingAtomic error:&error]) { NSLog(@"Error: %@", error); } (面writeToFileerror參數類型(NSError *__autoreleasing *)) 注意error定義strong型編譯器幫隱式做事情保證終傳入函數參數依__autoreleasing類型引用 NSError *error; NSError *__autoreleasing tempError = error; // 編譯器添加 if (![data writeToFile:filename options:NSDataWritingAtomic error:&tempError]) { error = tempError; // 編譯器添加 NSLog(@"Error: %@", error); } 所提高效率避免種情況我般定義error候其(實實==)聲明__autoreleasing類型: NSError *__autoreleasing error; 加__autoreleasing相於MRC返值error做事情: *error = [[[NSError alloc] init] autorelease]; *error指向象創建放入autoreleasing pool等待使用結束自釋放函數外error使用者並需要關*error指向象釋放 另外點ARC所種指針指針 (NSError **)函數參數加修飾符編譯器默認認定__autoreleasing類型 比面兩段代碼等同: - (NSString *)doSomething:(NSNumber **)value { // do something } - (NSString *)doSomething:(NSNumber * __autoreleasing *)value { // do something } 除非顯式給value聲明__strong否則value默認__autoreleasing 點某些類隱式使用自autorelease pool種候使用__autoreleasing類型要特別 比NSDictionary[]: - (void)loopThroughDictionary:(NSDictionary *)dict error:(NSError **)error { [dict :^(id key, id obj, BOOL *stop){ // do stuff if (there is some error && error != nil) { *error = [NSError errorWithDomain:@"MyError" code:依 userInfo:nil]; } }]; } 隱式創建autorelease pool面代碼實際類似於: - (void)loopThroughDictionary:(NSDictionary *)dict error:(NSError **)error { [dict :^(id key, id obj, BOOL *stop){ @autoreleasepool // 隱式創建 { if (there is some error && error != nil) { *error = [NSError errorWithDomain:@"MyError" code:依 userInfo:nil]; } } }]; // *error 已經dict做枚舉遍歷創建autorelease pool釋放掉 :( } 能夠使用*error我需要strong型臨引用dict枚舉Block用臨引用保證引用指向象dict枚舉Block釋放確式: - (void)loopThroughDictionary:(NSDictionary *)dict error:(NSError **)error { __block NSError* tempError; // 加__block保證Block內修改 [dict :^(id key, id obj, BOOL *stop) { if (there is some error) { *tempError = [NSError errorWithDomain:@"MyError" code:依 userInfo:nil]; } }] if (error != nil) { *error = tempError; }
❸ iOS應用開發:什麼是ARC
ARC是iOS 5推出的新功能,全稱叫 ARC(Automatic Reference Counting)。簡單地說,就是代碼中自動加入了retain/release,原先需要手動添加的用來處理內存管理的引用計數的代碼可以自動地由編譯器完成了。
該機能在 iOS 5/ Mac OS X 10.7 開始導入,利用 Xcode4.2 可以使用該機能。簡單地理解ARC,就是通過指定的語法,讓編譯器(LLVM 3.0)在編譯代碼時,自動生成實例的引用計數管理部分代碼。有一點,ARC並不是GC,它只是一種代碼靜態分析(Static Analyzer)工具。
變化點
通過一小段代碼,我們看看使用ARC前後的變化點。
C代碼
@interface NonARCObject : NSObject {
NSString *name;
}
-(id)initWithName:(NSString *)name;
@end
@implementation NonARCObject
-(id)initWithName:(NSString *)newName {
self = [super init];
if (self) {
name = [newName retain];
}
return self;
}
-(void)dealloc {
[name release];
[Super dealloc];
}
@end
C代碼
@interface ARCObject : NSObject {
NSString *name;
}
-(id)initWithName:(NSString *)name;
@end
@implementation ARCObject
-(id)initWithName:(NSString *)newName {
self = [super init];
if (self) {
name = newName;
}
return self;
}
@end
我們之前使用Objective-C中內存管理規則時,往往採用下面的准則
生成對象時,使用autorelease
對象代入時,先autorelease後再retain
對象在函數中返回時,使用return [[object retain] autorelease];
而使用ARC後,我們可以不需要這樣做了,甚至連最基礎的release都不需要了。
總結:
1,arc的設置是在build phases中修改compiler Flags的值。
2,如果使用了arc,在你的代碼中不可以使用retain, release, autorelease,如果使用的話會報錯。
3,如果使用了arc,在@property聲明中,用strong和weak代替相應的retain, ,和assign。
4,如果使用了arc,NSAutoReleasePool也不能使用,測試發現,用@autoreleasepool 代替,不會編譯報錯。
總之,一切你之前「背過」的那幾條內存管理規則,你都不用去管了。而且,個人感覺,用arc代碼清晰很多,而且效率也提高了些。
❹ arc是一種編譯時特性還是運行時特性
ARC本質
ARC編譯器()特性運行特性更垃圾收器(GC)
Automatic
Reference
Counting
(ARC)
is
a
compiler-level
feature
that
simplifies
the
process
of
managing
object
lifetimes
(memory
management)
in
Cocoa
applications.
ARC相於MRC(Manual
Reference
Counting或稱非ARC文我直使用MRC指代非ARC管理式)改進前技術本質沒區別具體信息參考ARC編譯器官文檔
ARC啟與關閉
同於XCode四創建工程選擇關閉ARCXCode5創建工程默認啟ARC沒關閉ARC選項
需要特定文件啟或關閉ARC工程選項選擇Targets
->
Compile
Phases
->
Compile
Sources面找應文件添加flag:
打ARC:-fobjc-arc
關閉ARC:-fno-objc-arc
圖:
ARC修飾符
ARC主要提供四種修飾符別:__strong,__weak,__autoreleasing,__unsafe_unretained
__strong
表示引用強引用應定義property"strong"所象沒任何強引用指向才釋放
注意:聲明引用加修飾符引用默認強引用需要釋放強引用指向象需要強引用置nil
__weak
表示引用弱引用應定義property用"weak"弱引用影響象釋放即要象沒任何強引用指向即使依00弱引用象指向沒用該象依釋放象釋放同指向弱引用自置nil技術叫zeroing
weak
pointer效防止效指針、野指針產__weak般用delegate關系防止循環引用或者用修飾指向由Interface
Builder編輯與UI控制項
__autoreleasing
表示autorelease
pool自釋放象引用MRC代autorelease用相同定義property能使用修飾符任何象property都應該autorelease型
見誤解ARC沒autorelease自釋放看起像點余誤解能源自於ARC自autorelease自混淆其實要看每iOS
Appmain.m文件能知道autorelease僅存著並且變更fashion:需要再手工創建需要再顯式調用[drain]釋放內存池
兩行代碼意義相同
NSString
*str
=
[[[NSString
alloc]
initWithFormat:@"hehe"]
autorelease];
//
MRC
NSString
*__autoreleasing
str
=
[[NSString
alloc]
initWithFormat:@"hehe"];
//
ARC
關於autoreleasepool做展詳細信息參考官文檔或者其文章
__autoreleasingARC主要用參數傳遞返值(out-parameters)引用傳遞參數(pass-by-reference)情況
__autoreleasing
is
used
to
denote
arguments
that
are
passed
by
reference
(id
*)
and
are
autoreleased
on
return.
比用NSError使用:
NSError
*__autoreleasing
error;
if
(![data
writeToFile:filename
options:NSDataWritingAtomic
error:&error])
{
NSLog(@"Error:
%@",
error);
}
(面writeToFileerror參數類型(NSError
*__autoreleasing
*))
注意error定義strong型編譯器幫隱式做事情保證終傳入函數參數依__autoreleasing類型引用
NSError
*error;
NSError
*__autoreleasing
tempError
=
error;
//
編譯器添加
if
(![data
writeToFile:filename
options:NSDataWritingAtomic
error:&tempError])
{
error
=
tempError;
//
編譯器添加
NSLog(@"Error:
%@",
error);
}
所提高效率避免種情況我般定義error候其(實實==)聲明__autoreleasing類型:
NSError
*__autoreleasing
error;
加__autoreleasing相於MRC返值error做事情:
*error
=
[[[NSError
alloc]
init]
autorelease];
*error指向象創建放入autoreleasing
pool等待使用結束自釋放函數外error使用者並需要關*error指向象釋放
另外點ARC所種指針指針
(NSError
**)函數參數加修飾符編譯器默認認定__autoreleasing類型
比面兩段代碼等同:
-
(NSString
*)doSomething:(NSNumber
**)value
{
//
do
something
}
-
(NSString
*)doSomething:(NSNumber
*
__autoreleasing
*)value
{
//
do
something
}
除非顯式給value聲明__strong否則value默認__autoreleasing
點某些類隱式使用自autorelease
pool種候使用__autoreleasing類型要特別
比NSDictionary[]:
-
(void)loopThroughDictionary:(NSDictionary
*)dict
error:(NSError
**)error
{
[dict
:^(id
key,
id
obj,
BOOL
*stop){
//
do
stuff
if
(there
is
some
error
&&
error
!=
nil)
{
*error
=
[NSError
errorWithDomain:@"MyError"
code:依
userInfo:nil];
}
}];
}
隱式創建autorelease
pool面代碼實際類似於:
-
(void)loopThroughDictionary:(NSDictionary
*)dict
error:(NSError
**)error
{
[dict
:^(id
key,
id
obj,
BOOL
*stop){
@autoreleasepool
//
隱式創建
{
if
(there
is
some
error
&&
error
!=
nil)
{
*error
=
[NSError
errorWithDomain:@"MyError"
code:依
userInfo:nil];
}
}
}];
//
*error
已經dict做枚舉遍歷創建autorelease
pool釋放掉
:(
}
能夠使用*error我需要strong型臨引用dict枚舉Block用臨引用保證引用指向象dict枚舉Block釋放確式:
-
(void)loopThroughDictionary:(NSDictionary
*)dict
error:(NSError
**)error
{
__block
NSError*
tempError;
//
加__block保證Block內修改
[dict
:^(id
key,
id
obj,
BOOL
*stop)
{
if
(there
is
some
error)
{
*tempError
=
[NSError
errorWithDomain:@"MyError"
code:依
userInfo:nil];
}
}]
if
(error
!=
nil)
{
*error
=
tempError;
}
❺ 使用arc4random()的c語言程序編譯時出現unresolved external symb
這是連接錯,這個 arc4random()肯定是聲明了,
如果 arc4random()是一個函數的話,可能是你沒有把.c或者.cpp文件加入工程,
如果是一個全局變數,可能是你沒有在.c或者.cpp文件中定義這個變數.